package com.fatgirl.time
{
	import com.fatgirl.patterns.iterator.ArrayIterator;
	import com.fatgirl.patterns.iterator.ArrayReverseIterator;
	import com.fatgirl.patterns.iterator.ICollection;
	import com.fatgirl.patterns.iterator.IIterator;
	
	import flash.utils.Dictionary;


	/**
	 *  
	 * 定时器
	 * 实现定时器访问者 对定时器对象进行控制
	 * 实现集合接口 便于统一管理
	 * 此类不对外公开 外界直接通过 工厂调用其接口使用即可
	 * @author iceman
	 * 
	 */
	internal class TimerVisitor implements ITimerVisitor , ICollection
	{
		private var m_elementList:Dictionary;
		public function TimerVisitor()
		{
			m_elementList = new Dictionary(false);
		}
		/**
		 * 添加定时器 
		 * @param _delay
		 * @param _timeElement
		 * @param _repeatCount
		 * 
		 */
		public function addTimer(_delay:int, _timeElement:ITimerElement, _repeatCount:int = 0):void
		{
			if(m_elementList[_timeElement])
			{
				removeTimer(_timeElement);
			}
			m_elementList[_timeElement]= new TimerElement(_delay,_timeElement,_repeatCount);
		}
		
		/**
		 * 移除定时器 
		 * @param _timeElement
		 * 
		 */
		public function removeTimer(_timeElement:ITimerElement):void
		{
			if(m_elementList[_timeElement])
			{
				(m_elementList[_timeElement] as TimerElement).remove();
			}
			m_elementList[_timeElement] = null;
			delete m_elementList[_timeElement];
		}
		/**
		 * 启动定时器 
		 * @param _timeElement
		 * 
		 */
		public function startTimer(_timeElement:ITimerElement):void
		{
			if(m_elementList[_timeElement])
			{
				(m_elementList[_timeElement] as TimerElement).start();
			}
		}
		/**
		 * 停止定时器 
		 * @param _timeElement
		 * 
		 */
		public function stopTimer(_timeElement:ITimerElement):void
		{
			if(m_elementList[_timeElement])
			{
				(m_elementList[_timeElement] as TimerElement).stop();
			}
		}
		/**
		 * 重置定时器 
		 * @param _timeElement
		 * 
		 */
		public function resetTimer(_timeElement:ITimerElement):void
		{
			if(m_elementList[_timeElement])
			{
				(m_elementList[_timeElement] as TimerElement).reset();
			}
		}
		/**
		 * 返回是否运行状态 
		 * @return 
		 * 
		 */
		public function running(_timeElement:ITimerElement):Boolean
		{
			if(m_elementList[_timeElement])
			{
				return (m_elementList[_timeElement] as TimerElement).running;
			}
			return false;
		}
		
		/**
		 * 返回迭代器 
		 * @param _type  迭代器类型 默认为正序，Reverse为倒序模式
		 * @return 
		 * 
		 */
		public function iterator(_type:String = null):IIterator
		{
			var t_list:Array=new Array;
			var t_index:int=0;
			for each (var i:* in m_elementList)
			{
				t_list[t_index]=i;
				t_index++;
			}
			
			
			var t_arr:IIterator;
			if(_type == "Reverse")
			{
				t_arr = new ArrayReverseIterator(t_list);
			}
			else
			{
				t_arr = new ArrayIterator(t_list)
			}
			return t_arr;
		}
	}
}